RBAC 功能可以限制對 Argo CD 資源的存取。Argo CD 本身設計沒有使用者管理系統,只有一個內建的 admin 超級使用者。另外 RBAC 需要搭配 SSO 或是地端使用者設定,這樣才能使得使用者綁定到 RBAC 角色。可以定義 RBAC 配置的兩個主要組件:
當使用這被 Argo CD 通過身分驗證時將被賦予 policy.default 中指定的角色。對於匿名存取即無須被驗證,對於是否可匿名存取可針對參數 users.anonymous.enabled 進行設定。當然 policy.default 絕對不是最佳實踐,而是要而外設計角色並附加於 policy.default 上。
Argo CD 有兩個預先定義的角色
role:readonly 對所有資源的存取權限是唯讀role:admin- 不受限制存取所有資源而 RBAC 配置允許定義角色(role)、群組(group)和 Policy。
group 允許將經過身份驗證的使用者或群組指派給內部角色結構:
g, <user/group>, <role>
<user/group> 被指派角色的實體。可以是本機的使用這或是 SSO 進行身分驗證的使用者。
<role> 實體被指派的內部角色。
結構:
p, <role/user/group>, <resource>, <action>, <object>, <effect>
<role/user/group> 指派權限至某個實體<resource> 要操作的資源類型<action> 對資源執行的操作<object> 表示資源的標識符,格式依資源類型而定<effect> 決定是否允許或拒絕對目標物件的存取,值為 allow 或 deny
下表總結了所有可能的資源以及對每個資源有效的操作。
| Resource Action | get | create | update | delete | sync | action | override | invoke | 
|---|---|---|---|---|---|---|---|---|
| applications | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | 
| applicationsets | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | 
| clusters | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | 
| projects | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | 
| repositories | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | 
| accounts | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | 
| certificates | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | 
| gpgkeys | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | 
| logs | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 
| exec | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 
| extensions | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | 
先以官方的範例來看
p, example-user, applications, delete/*/Pod/*, default/prod-app, allow
p, example-user, applications, update/*, default/prod-app, allow
p, example-user, applications, delete, default/prod-app, deny
p, example-user, applications, delete/*/Pod/*, default/prod-app, allow
p, my-local-user, applications, sync, my-project/*, allow
g, my-local-user, role:admin
<action> 欄位可以是 <action>/<group>/<kind>/<ns>/<name> 的設計。
前面的實驗有建置過下面的資源,接下來會基於此資源進行相關的 RBAC 設定。
# /developer/team-a/project/project.yaml
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-a-project
  namespace: argo
  # Finalizer that ensures that project is not deleted until it is not referenced by any application
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  description: Project for team-a
  sourceRepos:
  - https://github.com/CCH0124/K8s-with-quarkus.git
  destinations:
  - namespace: team-a
    name: stage-cluster
  - namespace: team-a
    name: k3d-dev-cluster
  clusterResourceWhitelist:
  - group: ''
    kind: Namespace
  namespaceResourceWhitelist:
  - group: 'apps'
    kind: Deployment
  - group: 'apps'
    kind: ReplicaSet
  - group: '*'
    kind: ServiceAccount
  - group: '*'
    kind: Service
  - group: '*'
    kind: Pod
  - group: 'batch'
    kind: Job
  permitOnlyProjectScopedClusters: false
以下也許是地端使用者整合的場景
對於建置的帳號,該帳號可能有兩種類型的權限
apiKey 允許產生用於存取 API 的令牌login 允許從 UI 登入建立使用者帳號格式為 accounts.<username>: <capabilities>。
現在假設有 dev、pm 和 op 三種角色,每個角色都有自己對應的權限。
視為開發者,對於 team-a-project 下的 Application 資源可以進行任何操作,對於 AppProject、repositories 和 clusters 只有讀的權限,而 applicationsets 將被拒絕任何操作。
視為專案管理者,對任何訊應當都為讀取權限,像是 applications、projects 和 repositories。而 clusters 和  applicationsets 將被拒絕任何操作。
視為維運者,其權限相比 dev 或 pm 來的大因此權限基本上都放行像是 exec 和 accounts 等資源。
Argo CD 使用 Helm Chart 佈署,因此可以如下進行 User 和 RBAC 設定部分。
        configs:
          cm:
            ...
            exec.enabled: true
            admin.enabled: true
            exec.shells: "bash,sh"
            accounts.devuser: login
            accounts.pmuser: login
            accounts.opsuser: login
            accounts.devuser1: login
            accounts.devuser1.enabled: "false"
          rbac:
            create: true
            policy.default: role:readonly
            policy.csv: |
                p, role:dev, applications, *,  team-a-project/*, allow
                p, role:dev, projects, get,  team-a-project, allow
                p, role:dev, repositories, get,  *, allow
                p, role:dev, clusters, get,  *, allow
                g, devuser, role:dev
                
                p, role:pm, applications, get,  */*, allow
                p, role:pm, projects, get,  *, allow
                p, role:pm, repositories, get,  *, allow
                p, role:pm, clusters, get,  *, allow
                g, pmuser, role:pm
                p, role:op, applications, *,  */*, allow
                p, role:op, projects, *,  *, allow
                p, role:op, repositories, *,  *, allow
                p, role:op, clusters, *,  *, allow
                p, role:op, accounts, *,  *, allow
                p, role:op, certificates, *,  *, allow
                p, role:op, gpgkeys, *,  *, allow
                p, role:op, exec, create, */*, allow
                g, opsuser, role:op
比較特別的配置是 exec.enabled 預設是關閉,其用於可以針對 Pod 資源進行遠端連線操作。這邊將設定為 true 且只有 opuser 能夠操做。
基本上在 configs.cm 下透過 accounts.<username>: <capabilities> 格式設定使用者帳號後 Argo CD 會建置帳號,如下透過 argocd account list 可以列出當前有的使用者帳號。
$ argocd account list
NAME      ENABLED  CAPABILITIES
admin     true     login
devuser   true     login
devuser1  false    login
opsuser   true     login
pmuser    true     login
這些建置的帳號預設沒有密碼,也無法正常登入因此藉由以下指令格式給予密碼。
argocd account update-password --account <new-username> --new-password <new-password>
如果是令牌,可以使用以下格式
argocd account generate-token --account <username>
devuser1 是無法被登入可以想像是離開專案的開發者,因此其登入帳號被進行控管。
            accounts.devuser1: login
            accounts.devuser1.enabled: "false"
從平台進行登入時理當會看到此訊息 Account devuser1 is disabled。
使用 CLI 方式使用 devuser 登入
argocd login argo.cch.com:8443 --grpc-web-root-path argocd --username devuser
對於 devuser1 其權限如下
p, role:dev, applications, *,  team-a-project/*, allow
p, role:dev, projects, get,  team-a-project, allow
p, role:dev, repositories, get,  *, allow
p, role:dev, clusters, get,  *, allow
g, devuser, role:dev    
對於 team-a-project AppProject 資源下的 Application 資源都可以進行操作但被限制於 team-a-project 下;但對於 projects、repositories、clusters 都只能獲取,不能夠新增或更新。這邊對於應用程式佈署我們限制於 team-a-project 同時只有 dev/stage 叢集能佈署,只要是其它叢集都會被拒絕。而 exec 此功能也是被拒絕,因此在平台上是無法進行遠端操作。
使用 devuser 嘗試對 opuser 管理的 sre-project 資源下進行 sync 操作,會出現 PermissionDenied 訊息。
$ argocd app sync argo/sre-app
FATA[0000] rpc error: code = PermissionDenied desc = permission denied: applications, sync, sre-project/sre-app, sub: devuser, iat: 2024-08-11T04:49:48Z
同理對 repositories 進行新增時也會有權限問題。
$ argocd repo add --name app https://github.com/CCH0124/K8s-with-quarkus.git --type git --project default
FATA[0000] rpc error: code = PermissionDenied desc = permission denied: repositories, create, default/https://github.com/CCH0124/K8s-with-quarkus.git, sub: devuser, iat: 2024-08-11T04:49:48Z
但對 team-a-project 下的 simple-app Application 資源執行 sync 是放行,在權限設計上是允許。
$ argocd app sync argo/simple-app
當然最快驗證可以使用 can-i 方式類似於 Kubernetes kubectl auth can-i。
$ argocd account can-i sync applications 'team-a-project/*'
yes
$ argocd account can-i sync applications 'sre-project/*'
no
$ argocd account can-i delete applications 'sre-project/*'
no
$ argocd account can-i delete clusters '*'
no
$ argocd account can-i get clusters '*'
yes
$ argocd account can-i get exec 'team-a-project/*'
no
$ argocd account can-i create exec 'sre-project/*'
no
$ argocd account can-i create exec 'team-a-project/*'
no
pmuser 部分讀者可以嘗試驗證看看,對於 pmuser 可以讀取資源,但基本沒權限建立像是 AppProject、repositories、clusters 等資源。
接著針對 opsuser 進行驗證。
登出 devuser 並使用 opsuser 登入。
argocd logout argo.cch.com:8443 --grpc-web-root-path argocd
argocd login argo.cch.com:8443 --grpc-web-root-path argocd --username opsuser
對於 opsuser 可以對 account 資源進行變更密碼等操作;exec 可以對資源進行遠端,剩下資源也可以進行刪除、建立或更新等操作。
$ argocd account can-i sync applications 'team-a-project/*'
yes
$ argocd account can-i sync applications 'sre-project/*'
yes
$ argocd account can-i delete applications 'team-a-project/*'
yes
$ argocd account can-i create clusters '*'
yes
$ argocd account update-password --account pmuser --new-password a1234567890
*** Enter password of currently logged in user (opsuser):
Password updated
$ argocd account can-i create exec 'team-a-project/*'
yes
$ argocd account can-i create exec 'sre-project/*'
yes
Argo CD 可以讓登入功能串接第三方 SSO 平台或是對於簡單團隊可以使用地端簡易配置 RBAC 方式進行使用者管理。對於本篇分享是對於地端配置進行簡易的設計,並理解 Argo CD 平台 RBAC 的結構以及可以如何進行細粒度上的資源控管。對於第三方 SSO 平台整合會相較於地端管理方式前期配置較複雜,這部分可以參考官方使用者管理。
Argo CD 本身也可以針對登入失敗的政策進行配置像是,這些設定都是正向且是有好的配置
最後可以從本篇文章知道如何使用 can-i 對 RBAC 進行驗證。